﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Xml;
using DAO;
using TPDiseño;

namespace TPDiseño.Interfaces
{
  
    public partial class CompletarCuest2 : Form
    {
        public Clases_de_Entidad.Cuestionario cuest = new Clases_de_Entidad.Cuestionario();
        public Clases_de_Entidad.Evaluacion eval = new Clases_de_Entidad.Evaluacion();
        public DAO.DAOCuestionario dCuestionario = new DAO.DAOCuestionario();
        public DAO.DAOEvaluacion dEvaluacion = new DAO.DAOEvaluacion();
        public Clases_de_Control.Gestor_Cuestionario gestorCuestionario = new Clases_de_Control.Gestor_Cuestionario();
        public Clases_de_Control.Gestor_Evaluacion gestorEvaluacion = new Clases_de_Control.Gestor_Evaluacion();
        public List<List <RadioButton>> listaRadio = new List<List<RadioButton>>();

        public Clases_de_Entidad.Usuario_logueado usuario = new Clases_de_Entidad.Usuario_logueado();
        public Clases_de_Entidad.Candidato cand = new Clases_de_Entidad.Candidato();
        public string usuario1;
        

        List<DTO_s.DTOPreguntasOpRta> listapreguntaOp = new List<DTO_s.DTOPreguntasOpRta>();
        List<DTO_s.DTOPreguntasOpRta> listapreguntaOpCuestionario = new List<DTO_s.DTOPreguntasOpRta>();
       
        


        public CompletarCuest2()
        {
            InitializeComponent();
        }
               
        
        public void CompletarCuest2_Load(object sender, EventArgs e)
        {
            
           
           this.MdiParent = Principal.ActiveForm;
           this.MdiParent.WindowState = FormWindowState.Maximized;
           this.WindowState = FormWindowState.Maximized;

           
          
       
           //IMPIDE CERRAR LA VENTANA CON LA X
           this.ControlBox = false;
           this.MdiParent.ControlBox = false;

           listapreguntaOpCuestionario = cuest.recuperaPreguntaCuestionario();
           int cantPreguntas = listapreguntaOpCuestionario.Count();
           int preguntasxBloque = Funciones.obtenerConfiguracionPreguntasPorBloques();
           int bloque = 0;


           if (cantPreguntas < preguntasxBloque)
               bloque = 1;
           else
           {
               if (cantPreguntas % preguntasxBloque == 0)
                   bloque = cantPreguntas / preguntasxBloque;
               else
                   bloque = (cantPreguntas / preguntasxBloque) + 1;
           }

           if (cuest._bloque == bloque)
           {
               Button_siguiente.Text = "Finalizar";
             //  Button_guardar.Visible = false;
           }

           switch (cuest._estado._estado)
           {
               case "ACTIVO":
                   string pri = null;
                   panel_completar.Visible = false;
                   panel_instrucciones.Visible = true;
                   
                   

                   XmlDocument xDoc = new XmlDocument();
                   xDoc = Funciones.cargarConfiguracionDesdeXLM();
                           

                   XmlNodeList Configuración = xDoc.GetElementsByTagName("Configuración");
                   
                   XmlNodeList lista = ((XmlElement)Configuración[0]).GetElementsByTagName("Instruccion");

                   foreach (XmlElement nodo in lista)
                   {
                       string nNombre = nodo.GetAttribute("Descripción");
                       pri = pri + "\r\n" + nNombre;


                       textBox1.Text = pri;

                   } 
                   break;

               case "EN PROCESO": 

                   

                   recuperarPantalla(bloque);
                   break;
               
           }
           }

        private void Label4_Click(object sender, EventArgs e)
        {

        }

        private void Button2_Click(object sender, EventArgs e)
        {
            Boolean respuesta;
            respuesta = respuestasvacias();
            
                if (respuesta)
                {
                    if (this.Button_siguiente.Text == "Finalizar")
                    {
                        
                        setOpRdida();
                        cuest._estado._cod_estado = 5; //5 es el id del estado "COMPLETO"
                        cuest = gestorCuestionario.guardarCuestionario(cuest);
                        cuest = gestorCuestionario.calcularpuntaje(cuest);
                        cuest = gestorCuestionario.guardarCuestionario(cuest);
                        this.MdiParent.ControlBox = true;
                        MessageBox.Show("Ha sido finalizado con éxito. El cuestionario quedará como COMPLETO", "Cuestionario completo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        this.Close();
                        Principal.ActiveForm.MainMenuStrip.Items[0].Enabled = true;
                    }

                    else
                    {
                        

                        setOpRdida();
                        cuest._bloque++;

                        gestorCuestionario.guardarCuestionario(cuest);
                       // this.Close();
                        this.Tag = "no";
                        

                        
                        
                       // gestorCuestionario.guardarCuestionario(cuest);

                        Interfaces.CompletarCuest2 completar = new Interfaces.CompletarCuest2();
                        completar.MdiParent = Principal.ActiveForm;
                        completar.cuest = this.cuest;
                        completar.MaximizeBox = true;
                        completar.AutoScroll = true;
                        completar.AutoSize = true;
                        

                      
                        
                        
                   /*     if (cuest._bloque == 5)
                        {
                            completar.Button_siguiente.Text = "Finalizar";
                            completar.Button_guardar.Visible = false;

                        }*/

                        this.Close();
                        completar.panel_completar.Visible = true;
                        completar.panel_instrucciones.Visible = false;
                        completar.Show();
                        
                    }
                   
                   
                }
                else
                {
                    MessageBox.Show("DEBE RESPONDER TODAS LAS PREGUNTAS", "PREGUNTAS NO CONTESTADAS", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }

            

            
          

        }



        private void panel1_Paint(object sender, PaintEventArgs e)
        {

        }

        private void panel1_Paint_1(object sender, PaintEventArgs e)
        {

        }

        private void Button_guardar_Click(object sender, EventArgs e)
        {
            Boolean respuesta;
            respuesta=respuestasvacias();
            
                setOpRdida();
                if (respuesta)
                    cuest._bloque++;

                gestorCuestionario.guardarCuestionario(cuest);
                this.Tag = "no";
                this.MdiParent.ControlBox = true;
                MessageBox.Show("El cuestionario fue guardado con éxito.", "Cuestionario guardado", MessageBoxButtons.OK, MessageBoxIcon.Information);
                this.Close();
                Principal.ActiveForm.MainMenuStrip.Items[0].Enabled = true;
                
                   
        }

        private bool respuestasvacias()
        {
            int i;
            
            foreach (List<RadioButton> listaR in listaRadio )
            {
                i = 0;     
                foreach (RadioButton rad in listaR)
                {
                    if (rad.Checked == true)
                       i=1;
                        
                }
                if (i == 0)
                    return false;
                    

           }
            
            return true;
        }

        private void setOpRdida()
        {
            int n, l=0;
            foreach (List<RadioButton> list in listaRadio)
            {
                n = 1;
                foreach (RadioButton rad in list)
                {
                    
                    if (rad.Checked)
                    {
                        foreach (Clases_de_Entidad.H_pregunta hpreg in cuest._preguntas)
                        {
                            if (hpreg._bloque == cuest._bloque && listapreguntaOp[l]._preg == hpreg)
                            {
                                
                                hpreg._op_respondida = n;
                                
                            }
                        }
                        
                    }
                    n++;
                    
                }
                l++;
           
            }
            
        
        
        }

        
        private void Button_Aceptar_Click(object sender, EventArgs e)
        {
            Button_Aceptar.Location = new Point(500, 500);
            panel_completar.Visible = true;
            panel_instrucciones.Visible = false;

            int preguntasPorBloque = Funciones.obtenerConfiguracionPreguntasPorBloques();
            int bandera = 1;
            int bloque = 1;

            listapreguntaOpCuestionario = cuest.recuperaPreguntaCuestionario();
            listapreguntaOpCuestionario = Funciones.obtenerPreguntasAleatriamente(listapreguntaOpCuestionario);



             if (preguntasPorBloque > listapreguntaOpCuestionario.Count())
            {
                foreach (DTO_s.DTOPreguntasOpRta dtoPregOp in listapreguntaOpCuestionario)
                {
                    dtoPregOp._preg._bloque = 1;
                    
                }
            }

            else
            {
                foreach (DTO_s.DTOPreguntasOpRta dtoPregOp in listapreguntaOpCuestionario)
                {
                    dtoPregOp._preg._bloque = bloque;

                    if (preguntasPorBloque == bandera)
                    {
                        bandera = 0;
                        bloque++;
                    }

                    bandera++;

                }
            }

             int cantPreguntas = listapreguntaOpCuestionario.Count();




             if (cantPreguntas < preguntasPorBloque)
                 bloque = 1;
             else
             {
                 if (cantPreguntas % preguntasPorBloque == 0)
                     bloque = cantPreguntas / preguntasPorBloque;
                 else
                     bloque = (cantPreguntas / preguntasPorBloque) + 1;
             }



                cuest._estado._cod_estado = 2; //2 es el id del estado "EN PROCESO"
          
            cuest=gestorCuestionario.guardarCuestionario(cuest);
            recuperarPantalla(bloque);
            
            
        }

        private void Button_cancelar_Click(object sender, EventArgs e)
        {
            this.MdiParent.ControlBox = true;

            this.Close();
            Principal.ActiveForm.MainMenuStrip.Items[0].Enabled = true;

            
           /* Interfaces.Ingresar ingre = new Ingresar();
            ingre.MdiParent = Principal.ActiveForm;
            ingre.MdiParent.MainMenuStrip.Items[0].Enabled = true;
            ingre.MdiParent.MainMenuStrip.Items[2].Enabled = false;
            ingre.MdiParent.WindowState = FormWindowState.Normal;
            ingre.WindowState = FormWindowState.Normal;
            ingre.MdiParent.ControlBox = true;
           
            ingre.Show();*/
        }

        public void recuperarPantalla(int bloque)
        {
            int j, k = 4, n = 0;
            int x = 0, y = 0, c = 100, d = 200;
           
            Point Pt, punto;

            panel_instrucciones.Visible = false;
            panel_completar.Visible = true;

        
           listapreguntaOp=cuest.recuperaPreguntaBloque();
           k = listapreguntaOp.Count();
           eval = gestorEvaluacion.CargarUnaEvaluacion(cuest);

            
           



// variables: k es la cantidad de preguntas que vienen del dtoPreguntasOpRta;
//x e y: posiciones del radiobutton;
// y, z: posiciones del nombre de la pregunta
// c y d: posiciones del panel

               
               int p = 0;
               for (j = 0; j < k ; j++)
               {
                   List<RadioButton> listR = new List<RadioButton>();
                   x = 0;
                   y = 25;                   
                   //crea el panel contenedor
                   Panel panel = new Panel();
                   panel.BackColor = Color.Transparent;
                   
                   panel.Visible = true;
                   panel.Location = new Point(c,d);
                   panel.Size = new Size(1000, 75);
                   
                   //crea una pregunta
                   punto = new Point(x, y);
                   Label lab = new Label();
                   lab.Location = punto;
                   lab.AutoSize = true;
                   
                   lab.Text = listapreguntaOp[j]._preg._pregunta;   
                   
                   listaRadio.Add(listR);
                   panel.Controls.Add(lab);
                   
                   y += 25;
                  
                   for(int s=0; s<listapreguntaOp[j]._rtas.Count; s++)
                   {
                        

                       Pt = new Point(x, y);

                       RadioButton miRadioButton = new RadioButton();

                   
                       miRadioButton.Location = Pt;

                       miRadioButton.Text = listapreguntaOp[j]._rtas[s]._descripcion;
                      
                       miRadioButton.Width = 180;
                       miRadioButton.TabIndex = n;
                       panel.Controls.Add(miRadioButton);
                       x += 200;
                      
                       n++;
                       listaRadio[j].Add(miRadioButton);
                   }

                   foreach (TPDiseño.Clases_de_Entidad.H_respuesta hresp in listapreguntaOp[j]._rtas)
                   {
                       if (listapreguntaOp[j]._preg._op_respondida == hresp._orden_visualizacion)
                       {
                           int l=0;
                           for (l = 0; l < listaRadio[j].Count(); l++)
                           {
                               if (hresp._orden_visualizacion == l + 1)
                                 listaRadio[j][l].Checked = true;

                               listaRadio[j][l].Enabled = false;

                           }

                           
                        }
   
                   }


                   p++;
                    
                   panel_completar.Controls.Add(panel);
                   
                   d += 75;
               }

              
               panel_completar.Location = new Point(500, 100);


                d = d + 50;
                Button_guardar.Location = new Point(472, d);
                Button_siguiente.Location = new Point(364, d);
                Label_bloque.Location = new Point(31, d);
                label2.Text = cuest._bloque.ToString();
                
                label3.Text = " " + "de" + " " + bloque.ToString();
                label2.Location = new Point(80, d);
                label3.Location = new Point(100, d);
               
                usuario1=gestorCuestionario.cargarUsuario(cuest);
                label4.Text = "Candidato autenticado: "+usuario1;

                TimeSpan time3, time4, time5;
                DateTime time, time2;

                //buscar tiempos en base de datos
                //TIME ES TIEMPO MAXIMO PARA REALIZAR CUESTIONARIO, hay que reemplazarlo por cuest._tiempoMax
                // TIME2 ES LA HORA ACTUAL DEL SISTEMA
                //TIME3 ES TIEMPO MÁXIMO EN ESTADO ACTIVO, hay que reemplazarlo por cuest._tiempoMaxActivo
                time = DateTime.Now;
                time2 = eval._fecha_fin;

                time3 = eval._tiempoMaximo;
                time4 = cuest._timepoTrascurrido;
        

                time5 = time3.Subtract(time4);

                Timer timer = new Timer();
                timer.Interval = 1000;

                timer.Tick += (a, b) =>
                {
                    time = time.Add(new TimeSpan(0, 0, 1));
                    //time2 = time2.Subtract(new TimeSpan(0, 0, 1)); //TimeSpan.Parse(DateTime.Now.ToString("hh:mm:ss"));
                    time5 = time5.Subtract(new TimeSpan(0, 0, 1));
                    label7.Text = time2.ToString();
                    label7.Font = new Font("ARIAL", 18);
                    label9.Text = time.ToString();
                    label9.Font = new Font("ARIAL", 18);
                    label10.Text = time5.ToString();
                    label10.Font = new Font("ARIAL", 18);
                    label7.ForeColor = System.Drawing.Color.LightGreen;
                    label10.ForeColor = System.Drawing.Color.LightGreen;
                   

                    /*if(time.Hour==0 && time.Minute<5)
                        label7.ForeColor = System.Drawing.Color.Red;*/

                    cuest._timepoTrascurrido = time3.Subtract(time5);

                    if (eval._fecha_fin < time)
                    {
                        timer.Stop();
                        cuest._estado._cod_estado = 4;
                        gestorCuestionario.guardarCuestionario(cuest);
                        MessageBox.Show("Se agotó el tiempo para completar el cuestionario. El cuestionario quedará como INCOMPLETO", "Cuestionario incompleto", MessageBoxButtons.OK, MessageBoxIcon.Stop);
                        this.MdiParent.ControlBox = true;
                        this.Close();
                        Principal.ActiveForm.MainMenuStrip.Items[0].Enabled = true;
                        
                    }

                    if (time5.Hours == 0 && time5.Minutes < 5)
                        label10.ForeColor = System.Drawing.Color.Red;

                    if (time5.Days == 0 && time5.Hours == 0 && time5.Minutes == 0 && time5.Seconds == 0)
                    {
                        //TIEMPO PERMITIDO PARA EL ESTADO ACTIVO
                        timer.Stop();
                        if (this.Tag != "no")
                        {
                            MessageBox.Show("Se agotó el tiempo para completar el cuestionario. El cuestionario quedará como INCOMPLETO", "Cuestionario incompleto", MessageBoxButtons.OK, MessageBoxIcon.Stop);

                          
                            cuest._estado._cod_estado = 4; // 4 es el id para el estado "INCOMPLETO"
                            cuest._ultimo_acceso = DateTime.Now;
                            gestorCuestionario.guardarCuestionario(cuest);
                            this.MdiParent.ControlBox = true;
                            this.Close();
                            Principal.ActiveForm.MainMenuStrip.Items[0].Enabled = true;
                        }
                    }
                };

                timer.Start();
                
                

            }

     

        private void panel_completar_Paint(object sender, PaintEventArgs e)
        {

        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            
        }

        private void Label1_Click(object sender, EventArgs e)
        {
           
        }

        private void label2_Click(object sender, EventArgs e)
        {

        }

        private void Label5_Click(object sender, EventArgs e)
        {

        }

        private void Label8_Click(object sender, EventArgs e)
        {

        }

        private void label3_Click(object sender, EventArgs e)
        {

        }

     
    }
}
